#ifndef GAUGECLOUD_H
#define GAUGECLOUD_H

#include <QWidget>
#include <QTimer>
#include <QColor>
#include <QVector>
#include <QPainterPath>
#include <QPixmap>


/**
 * @brief 交互式环形图标控件（灰白色调优化版）
 *
 * 该控件提供8个方向图标（含中心图标）的交互式环形布局，专为灰度设计优化
 *
 * @note
 * - 所有颜色严格使用灰度（R=G=B），避免任何非灰度色调
 * - 点击效果通过颜色深度变化实现（深→中→浅）：普通(70)→hover(50)→press(30)
 * - 仅支持灰白色调风格（CloudStyle_White）
 *
 * @warning 请勿使用非灰度颜色设置，否则会导致颜色失真
 */
class GaugeCloud : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(bool gradient READ gradient WRITE setGradient)
    Q_PROPERTY(int margin READ margin WRITE setMargin)
    Q_PROPERTY(int centerBorderWidth READ centerBorderWidth WRITE setCenterBorderWidth)
    Q_PROPERTY(bool autoRepeat READ autoRepeat WRITE setAutoRepeat)
    Q_PROPERTY(int autoRepeatDelay READ autoRepeatDelay WRITE setAutoRepeatDelay)
    Q_PROPERTY(int autoRepeatInterval READ autoRepeatInterval WRITE setAutoRepeatInterval)

public:
    /**
     * @brief 环形图标控件风格枚举
     *
     * @note 仅支持灰白色调（CloudStyle_White），其他风格将被忽略
     */
    enum CloudStyle { CloudStyle_White };

    /**
     * @brief 构造函数
     * @param parent 父窗口指针
     */
    explicit GaugeCloud(QWidget *parent = nullptr);

    /**
     * @brief 析构函数
     */
    ~GaugeCloud() override = default;

    /**
     * @brief 检查是否使用渐变背景
     * @return true=使用渐变, false=使用纯色背景
     */
    bool gradient() const { return m_gradient; }

    /**
     * @brief 设置是否使用渐变背景
     * @param g true=使用渐变, false=使用纯色背景
     */
    void setGradient(bool g) { m_gradient = g; update(); }

    /**
     * @brief 获取内边距
     * @return 内边距值（像素）
     */
    int margin() const { return m_margin; }

    /**
     * @brief 设置内边距
     * @param v 内边距值（像素）
     */
    void setMargin(int v) { m_margin = v; update(); }

    /**
     * @brief 获取中心区域边框宽度
     * @return 中心区域边框宽度（像素）
     */
    int centerBorderWidth() const { return m_centerBorderWidth; }

    /**
     * @brief 设置中心区域边框宽度
     * @param w 中心区域边框宽度（像素）
     */
    void setCenterBorderWidth(int w) { m_centerBorderWidth = w; update(); }

    /**
     * @brief 检查是否启用自动重复
     * @return true=启用自动重复, false=禁用
     */
    bool autoRepeat() const { return m_autoRepeat; }

    /**
     * @brief 设置是否启用自动重复
     * @param v true=启用, false=禁用
     */
    void setAutoRepeat(bool v) { m_autoRepeat = v; }

    /**
     * @brief 获取自动重复延迟时间
     * @return 延迟时间（毫秒）
     */
    int autoRepeatDelay() const { return m_autoRepeatDelay; }

    /**
     * @brief 设置自动重复延迟时间
     * @param ms 延迟时间（毫秒）
     */
    void setAutoRepeatDelay(int ms) { m_autoRepeatDelay = ms; }

    /**
     * @brief 获取自动重复间隔时间
     * @return 间隔时间（毫秒）
     */
    int autoRepeatInterval() const { return m_autoRepeatInterval; }

    /**
     * @brief 设置自动重复间隔时间
     * @param ms 间隔时间（毫秒）
     */
    void setAutoRepeatInterval(int ms) { m_autoRepeatInterval = ms; m_repeatTimer.setInterval(ms); }


    /**
     * @brief 设置背景颜色
     * @param c 背景颜色（必须为灰度，R=G=B）
     */
    void setBgColor(const QColor &c) { m_bgColor = c; update(); }

    /**
     * @brief 设置图标颜色
     * @param c 图标颜色（必须为灰度，R=G=B）
     */
    void setTextColor(const QColor &c) { m_textColor = c; update(); }

    /**
     * @brief 设置悬停时图标颜色
     * @param c 悬停颜色（必须为灰度，R=G=B）
     */
    void setEnterColor(const QColor &c) { m_enterColor = c; update(); }

    /**
     * @brief 设置按下时图标颜色
     * @param c 按下颜色（必须为灰度，R=G=B）
     */
    void setPressColor(const QColor &c) { m_pressColor = c; update(); }

    /**
     * @brief 设置边框颜色
     * @param c1 外圈主色
     * @param c2 次浅灰
     * @param c3 中灰
     * @param c4 外圈主色（与c1相同）
     */
    void setBorderColors(const QColor &c1, const QColor &c2, const QColor &c3, const QColor &c4) {
        m_borderColor1 = c1; m_borderColor2 = c2; m_borderColor3 = c3; m_borderColor4 = c4; update();
    }

    /**
     * @brief 设置中心区域颜色
     * @param normal 普通状态颜色
     * @param hover 悬停状态颜色
     * @param press 按下状态颜色
     */
    void setCenterColors(const QColor &normal, const QColor &hover, const QColor &press) {
        m_centerBgColor = normal;
        m_centerHoverColor = hover;
        m_centerPressColor = press;
        update();
    }

    /**
     * @brief 设置方向图标（8个方向）
     * @param pixmaps 图标列表（顺序：0=底部,1=左下角,2=左侧,3=左上角,4=顶部,5=右上角,6=右侧,7=右下角）
     */
    void setDirectionPixmaps(const QVector<QPixmap> &pixmaps) { m_directionPixmaps = pixmaps; update(); }

    /**
     * @brief 设置中心图标
     * @param pixmap 中心图标
     */
    void setCenterPixmap(const QPixmap &pixmap) { m_centerPixmap = pixmap; update(); }

    /**
     * @brief 设置方向图标路径（8个方向）
     * @param paths 路径列表（顺序同setDirectionPixmaps）
     */
    void setDirectionPaths(const QVector<QPainterPath> &paths) { m_directionPaths = paths; update(); }

    /**
     * @brief 设置中心图标路径
     * @param path 中心图标路径
     */
    void setCenterPath(const QPainterPath &path) { m_centerPath = path; update(); }

signals:
    /**
     * @brief 鼠标按下信号
     * @param position 位置索引（0-7=方向,8=中心）
     * @param name 位置名称（如"底部"、"中间"）
     */
    void mousePressed(int position, const QString &name);

    /**
     * @brief 鼠标释放信号
     * @param position 位置索引（0-7=方向,8=中心）
     * @param name 位置名称（如"底部"、"中间"）
     */
    void mouseReleased(int position, const QString &name);

    /**
     * @brief 位置变化信号
     * @param position 位置索引（0-7=方向,8=中心）
     * @param name 位置名称（如"底部"、"中间"）
     */
    void positionChanged(int position, const QString &name);

protected:
    /**
     * @brief 绘制事件处理
     * @param ev 绘制事件
     */
    void paintEvent(QPaintEvent *ev) override;

    /**
     * @brief 大小调整事件处理
     * @param ev 大小调整事件
     */
    void resizeEvent(QResizeEvent *ev) override;

    /**
     * @brief 鼠标进入事件处理
     * @param ev 鼠标进入事件
     */
    void enterEvent(QEvent *ev) override;

    /**
     * @brief 鼠标离开事件处理
     * @param ev 鼠标离开事件
     */
    void leaveEvent(QEvent *ev) override;

    /**
     * @brief 鼠标按下事件处理
     * @param ev 鼠标按下事件
     */
    void mousePressEvent(QMouseEvent *ev) override;

    /**
     * @brief 鼠标释放事件处理
     * @param ev 鼠标释放事件
     */
    void mouseReleaseEvent(QMouseEvent *ev) override;

    /**
     * @brief 鼠标移动事件处理
     * @param ev 鼠标移动事件
     */
    void mouseMoveEvent(QMouseEvent *ev) override;

private slots:
    /**
     * @brief 自动重复定时器超时处理
     */
    void onRepeatTimerTimeout();

private:
    /**
     * @brief 初始化默认值
     */
    void initDefaults();

    /**
     * @brief 根据风格初始化颜色
     * @param s 风格枚举值
     */
    void initColorsForStyle(CloudStyle s);

    /**
     * @brief 绘制背景
     * @param p 绘图器
     */
    void paintBackground(QPainter &p);

    /**
     * @brief 绘制中心区域
     * @param p 绘图器
     */
    void paintInnerCircle(QPainter &p);

    /**
     * @brief 绘制图标
     * @param p 绘图器
     */
    void paintIcons(QPainter &p);

    /**
     * @brief 检测点击位置
     * @param localPos 本地坐标
     * @return 位置索引（-1=无点击,0-7=方向,8=中心）
     */
    int hitTestLocal(const QPoint &localPos) const;

    /**
     * @brief 获取控件中心点
     * @return 控件中心点坐标
     */
    QPointF widgetCenter() const;

    /**
     * @brief 计算两点间距离
     * @param a 点A
     * @param b 点B
     * @return 两点间欧氏距离
     */
    double twoPtDistance(const QPointF &a, const QPointF &b) const;

private:
    // ======================= 核心属性 =======================
    bool m_gradient = true; ///< 是否使用渐变背景
    int m_margin = 0;      ///< 内边距（像素）
    int m_centerBorderWidth = 3; ///< 中心区域边框宽度（像素）

    // ======================= 状态管理 =======================
    bool m_enter = false;  ///< 鼠标悬停状态
    bool m_pressed = false; ///< 鼠标按下状态
    bool m_inCenter = false; ///< 是否在中心区域
    QPoint m_lastPoint;    ///< 最后鼠标位置
    int m_position = 0;    ///< 当前选中位置索引（0-7=方向,8=中心）
    bool m_autoRepeat = true; ///< 是否启用自动重复
    int m_autoRepeatDelay = 500; ///< 自动重复延迟时间（毫秒）
    int m_autoRepeatInterval = 200; ///< 自动重复间隔时间（毫秒）
    QTimer m_repeatTimer;  ///< 自动重复定时器

    // ======================= 颜色配置 =======================
    QColor m_borderColor1, m_borderColor2, m_borderColor3, m_borderColor4; ///< 边框颜色（渐变用）
    QColor m_bgColor, m_textColor, m_enterColor, m_pressColor; ///< 背景/图标颜色
    QColor m_centerBorderColor, m_centerBgColor, m_centerHoverColor, m_centerPressColor; ///< 中心区域颜色

    // ======================= 图标数据 =======================
    QVector<QPixmap> m_directionPixmaps; ///< 方向图标（8个方向）
    QPixmap m_centerPixmap;               ///< 中心图标
    QVector<QPainterPath> m_directionPaths; ///< 方向图标路径
    QPainterPath m_centerPath;            ///< 中心图标路径
    QStringList m_positions;              ///< 位置名称列表（顺序：0=底部,1=左下角,...,8=中间）

    // ======================= 风格配置 =======================
    CloudStyle m_style; ///< 当前风格（仅CloudStyle_White有效）
};

#endif // GAUGECLOUD_H
